<?php namespace Home\Controller; 
use Hdphp\Controller\Controller;
//商品列表控制器
class ListController extends Controller{

	//构造函数
	public function __init()
	{
		parent::__init();
	}
    public function index(){
    	//获得分类ID
		$cate_id = Q('get.cate_id',0,'intval');
	
		$gcateModel = new \Common\Model\Gcate;
		$goodsModel = new \Common\Model\Goods;
		//获得所有分类
		$gcateAll = $gcateModel->get();
				
		//=====================获取分类下的所有子元素的数据    开始=====================
        $cateSonData = $this->getSon($gcateAll,$cate_id);
		//p($cateSonData);exit;
		//将当前分类也压入到子分类里面
        $cateSonData[] = $cate_id;
		
		//1.商品列表 (检索出 该分类以及该分类一下的商品)
        //分类表 关联 商品表，获取当前分类下所有商品 （即取出某一分类下的商品）
        $goodsData = $gcateModel->join('goods','gcategory_cate_id','=','cate_id')
        						->where("cate_id in (".implode(',',$cateSonData).")")
								->orderBy('add_time','DESC')
        						->get();
		//p($goodsData);exit;						
		View::with('goodsData',$goodsData);
		
		//2.统计当前分类下商品数目
		//分类表 关联 商品表，统计当前分类下商品数目
		$goodsCount = $gcateModel->join('goods','gcategory_cate_id','=','cate_id')
							     ->where("cate_id in (".implode(',',$cateSonData).")")
							     ->count();
		View::with('goodsCount',$goodsCount);
		
		
		//=====================当前分类下商品的品牌    开始=====================
		$goodsBrandIDs = $goodsModel->where("gcategory_cate_id={$cate_id} and brand_brand_id!=0")->lists('brand_brand_id');
		//p($goodsBrandIDs);//1.p 出来，1个分类下 多个商品 具有同一个品牌
/*Array
(
    [0] => 1
    [1] => 1
    [2] => 2
    [3] => 2
    [4] => 2
    [5] => 2
    [6] => 1
)*/	
		$brandModel = new \Common\Model\Brand;
		if(!empty($goodsBrandIDs)){
			$goodsBrandIDs = array_unique($goodsBrandIDs); //2.使用去重函数array_unique
/*Array
(
    [0] => 1
    [2] => 2
)*/
			$brandData = $brandModel->where("brand_id in(" . implode(',', $goodsBrandIDs) . ")")->field('brand_id,brand_name,brand_logo')->get();
			//p($brandData);
			View::with('brandData',$brandData);
		}
		
		$brand_id = isset($_GET['brand_id']) ? Q('get.brand_id') : 0;
//		p($brand_id);
		View::with('brand_id',$brand_id);
		
		//通过品牌id找商品id，检索出 对应的商品
		
		//=====================当前分类下商品的品牌    结束=====================		
		
		

		//=====================当前父级下面的子集   开始=====================
		//通过cid，找对应子集的内容   lists()方法  从表中取出指定的字段。
		//如果 传过来是 是羽绒服的cate_id 19  
		$cids = $gcateModel->where("p_id={$cate_id}")->lists('cate_id');
		// 检索 19，$cids下面没有子集
		//p($cids);
/*Array
(
    [0] => 19  羽绒服
    [1] => 20  毛衣
    [2] => 21
    [3] => 22
    [4] => 23
    [5] => 24
    [6] => 25
    [7] => 26
)*/
		if($cids){
			//羽绒服的cate_id 19  不走这个if体
			//通过子集cid，找到对应的子类
			$gcateDatas = $gcateModel->where("cate_id in (" . implode(',',$cids) . ")")->field('cate_id,cate_name')->get();
		}else{
			//找 19 的父级  （即 查询 19这条数据，找出 19这条数据里的 父p_id这个字段，看父id是谁，取出来，赋给 变量$pid）
			//如果cid不存在，停留   在当前父级     找到当前父级
			$pid = $gcateModel->where("cate_id={$cate_id}")->pluck('p_id');
			//p($pid);
			//找到 19的 父p_id=16，找16这个父id当前的子集。即 停留在当前父id上。（要理解！！写着写着就蒙圈了。。多想。）
			//找当前父级 对应子集的内容
			$gcateDatas = $gcateModel->where('p_id=' . $pid)->get();
			//p($gcateDatas);
		}	
		//p($gcateDatas);
		View::with('gcateDatas',$gcateDatas);
		
		//=====================当前父级下面的子集   结束=====================
	
	
	
		//1.通过当前的cid获得对应的商品的gids
		$gids = $this->cidGetGids(Q('get.cate_id',0,'intval'));
		//p($gids);
		//2.根据gids找到商品属性
		$goodsAttr = $this->gidGetAttr($gids);
		//p($goodsAttr);
		View::with('goodsAttr',$goodsAttr);
		//3.处理筛选参数param 0_0_......
		//(2).考虑有几个0。这几个0，正好是统计的商品属性的个数
		$num = count($goodsAttr);
		//p($num); //点击时尚女装 cate_id=16
		//p的结果：4
		//(1).考虑的时候，先假设 这个，先写这里
		if($num){
			$param = isset($_GET['param']) ? explode('_', $_GET['param']) : array_fill(0, $num, 0);
			
		//p($param);
/*Array
(
    [0] => 0
    [1] => 0
    [2] => 0
    [3] => 0
)*/

/*	
 * 		array_fill($start_index, $num, $value)	 array_fill() 函数用   给定的值$value   填充   数组，返回的数组有 num 个元素
 * 	
 * 		//例如：把Dog，填到3个地方去，从什么位置开始填。从索引是2的这个位置开始填。
 *		$a=array_fill(2,3,"Dog");
 *		print_r($a);
 * 
*/			
			//p($param);
			View::with('param',$param);
			
			
			//4.通过param参数筛选商品gids
			if($param){
				$resultGids = $this->filter($param,$gids);
				//p($resultGids);
				if($resultGids){
					$gids = $goodsModel->where("goods_id in(" . implode(',', $resultGids) . ")")->field('goods_id')->get();
					//p($gids);
				}
			}
			
/*			//知识点：array_intersect(array1,array2,array3...) array_intersect() 函数返回两个或多个数组的交集数组。  前2个array1,array2必须写。

			$a1 = array(0=>"Cat",1=>"Dog",2=>"Horse");
			$a2 = array(3=>"Horse",4=>"Dog",5=>"Fish");
			p(array_intersect($a1,$a2));
Array
(
    [1] => Dog
    [2] => Horse
)
 * */
			
			
		}


		
		
		//=====================当前位置   开始=====================
		$currentNav = $this->getfather($gcateAll, $cate_id);
		$currentNav = $this->unListArr($currentNav);
		//p($currentNav);exit;
		View::with('currentNav',$currentNav);
		//=====================当前位置   结束=====================
		
		//=====================获取分类数据 为了SEO   开始=====================
		$gcateData = $this->get_gcates();
		View::with('gcateData',$gcateData);
		//=====================获取分类数据 为了SEO   结束=====================

        View::make();
    }

	//
/*
 * cate_id=19&param=4_53_0_63
 * 
 * param=4_53_0_63  是商品属性表goods_attr里的 ga_id 
 * 
 * 遍历这个数组 param
Array
(
    [0] => 4
    [1] => 53
    [2] => 0
    [3] => 63
)
 * 通过当前的cid获得对应的商品的gids  作为参数 传进去。
 * $resultGids = $this->filter($param,$gids);
*/
	private function filter($param,$cidGids){
		$gids = array();
		foreach($param as $ga_id){
			if($ga_id){
				//1.以这个$ga_id 为条件，到商品属性表goods_attr里 取数据。
				//找到ga_value
				$ga_value = Db::table('goods_attr')->where("ga_id={$ga_id}")->pluck('ga_value');
				//p($ga_value);
				//2.通过ga_value，找到对应的商品id   注意：这里是通过汉字 来检索数据,因为是汉字即字符串 所以需要加'{$ga_value}'
				$gids[] = Db::table('goods_attr')->where("ga_value='{$ga_value}'")->lists('goods_goods_id');
				
			}
			//p($gids);
		}
		//如果点击了“不限”之外的属性
		if($gids){
			//取交集
			$gidsTemp = $gids[0];
			foreach($gids as $v){
				$gidsTemp = array_intersect($gidsTemp, $v);
			}
			//和当前分类对应的gid再次取交集
			return array_intersect($gidsTemp, $cidGids);
		}else{//如果是 全部是 “不限”的时候
			return $cidGids;
		}
		
		
	}
	

	

	//=====================当前分类下 商品属性 内容显示   开始=====================
	//通过gid获得商品的属性
	private function gidGetAttr($gids){
		//==============商品属性表goods_attr
		if($gids){
			$data = Db::table('goods_attr')->where("goods_goods_id in(" . implode(',', $gids) . ")")->groupBy('ga_value')->get();
			//p($data);
			
			//2.以 商品属性表里的外键 类型属性fattr_fa_id分组放置内容       把相同类型属性fattr_fa_id的 归结在一起   
			$sameAttr = array();
			if($data){
				foreach($data as $v){
					$sameAttr[$v['fattr_fa_id']][] = $v; //以他为 $v['fattr_fa_id'] 归结数据
				}
			}
			//p($sameAttr);
			//==============类型属性表fattr
			//3.组合数组
			$temp = array();
			foreach($sameAttr as $fa_id => $v){
				$temp[] = array(
					'name' =>Db::table('fattr')->where("fa_id={$fa_id}")->pluck('fattr_name'),
					'value' => $v
				);
			}
			//p($temp);
			return $temp;

			
		}else{
			$this->error ="此商品没有属性。";
		}


	}

    //通过cid获得gids  例如 点击 羽绒服  cate_id=19
    private function cidGetGids($cid){
    	//1.通过当前分类cid获得对应的所有的子集cid
    	$cids = $this->getSon(Db::table('gcategory')->get(), $cid);
		$cids[] = $cid;//因为传进来的当前的cid他本身也有可能有商品，所以把自己也压进去。
		//2.通过子集cid 找到 对应的 商品的 gid
		$gids = Db::table('goods')->where("gcategory_cate_id in(" . implode(',', $cids) . ")")->lists('goods_id');
		//p($gids);
/*Array
(
    [0] => 3
    [1] => 12
    [2] => 4
    [3] => 5
    [4] => 13
    [5] => 7
    [6] => 8
    [7] => 9
    [8] => 10
    [9] => 11
    [10] => 15
)*/
		//返出 找到的$gids
		return $gids;
    }
	

	//=====================当前分类下 商品属性 内容显示   结束=====================

	
	
	//=====================获取分类下的所有子元素的数据    开始=====================
    //获得所有的子集cid
    public function getSon($data,$cate_id){
        $temp=array();
        foreach ($data as $v) {
            if($v['p_id'] == $cate_id){
                //把子集的cid压入到temp临时数组
                $temp[] = $v['cate_id'];
                //合并数组， 组合成新数组
                $temp = array_merge($temp,$this->getSon($data,$v['cate_id']));
            }
        }
        return $temp;
    }
	//=====================获取分类下的所有子元素的数据    结束=====================

	
	
	//=====================当前位置   开始=====================
	//当前位置(获取某一个元素的所有父级分类)
    public function getfather($data,$p_id){
//        p($data);
        $temp=array();
        foreach($data as $v){
//            $v
            if($v['cate_id']==$p_id){
                $temp[]=$v;
                $temp=array_merge($temp,$this->getfather($data,$v['p_id']));
            }
//            p($temp);
        }
        return $temp;

    }
    public function unListArr($data){
        for($i=0;$i<count($data);$i++){
            $arr[] = $data[count($data)-$i-1];
        }
        if(isset($arr)){
            return $arr;
        }else{
        	return 0;
		}
    }
	//=====================当前位置   结束=====================
	

	//=====================获取分类数据 为了SEO   开始=====================
	public function get_gcates(){
		$gcategoryModel = new \Common\Model\Gcate;
		$gcateData = $gcategoryModel->where("cate_id=" . Q('get.cate_id',0,'intval'))->find();
		//p($gcateData);exit;
		return $gcateData;
	}
	//=====================获取分类数据 为了SEO   结束=====================
	
	
	
}